#include "gtkgestureclick.h"
#include "gtkmodelbuttonprivate.h"
#include "gtkpopover.h"
-
+#include "gtksnapshot.h"
+#include "gdktextureprivate.h"
#include <glib/gprintf.h>
/**
}
}
+static GdkTexture *
+render_paintable_to_texture (GdkPaintable *paintable)
+{
+ GtkSnapshot *snapshot;
+ GskRenderNode *node;
+ int width, height;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+ GdkTexture *texture;
+
+ width = gdk_paintable_get_intrinsic_width (paintable);
+ height = gdk_paintable_get_intrinsic_height (paintable);
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+
+ snapshot = gtk_snapshot_new ();
+ gdk_paintable_snapshot (paintable, snapshot, width, height);
+ node = gtk_snapshot_free_to_node (snapshot);
+
+ cr = cairo_create (surface);
+ gsk_render_node_draw (node, cr);
+ cairo_destroy (cr);
+
+ gsk_render_node_unref (node);
+
+ texture = gdk_texture_new_for_surface (surface);
+ cairo_surface_destroy (surface);
+
+ return texture;
+}
static void
add_pid_to_process_list_store (GtkMountOperation *mount_operation,
24, 1,
gtk_widget_get_direction (GTK_WIDGET (mount_operation->priv->dialog)),
0);
- texture = gtk_icon_paintable_download_texture (icon);
+ texture = render_paintable_to_texture (GDK_PAINTABLE (icon));
g_object_unref (icon);
}
return area_a - area_b;
}
+static GdkTexture *
+render_paintable_to_texture (GdkPaintable *paintable)
+{
+ GtkSnapshot *snapshot;
+ GskRenderNode *node;
+ int width, height;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+ GdkTexture *texture;
+
+ width = gdk_paintable_get_intrinsic_width (paintable);
+ height = gdk_paintable_get_intrinsic_height (paintable);
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+
+ snapshot = gtk_snapshot_new ();
+ gdk_paintable_snapshot (paintable, snapshot, width, height);
+ node = gtk_snapshot_free_to_node (snapshot);
+
+ cr = cairo_create (surface);
+ gsk_render_node_draw (node, cr);
+ cairo_destroy (cr);
+
+ gsk_render_node_unref (node);
+
+ texture = gdk_texture_new_for_surface (surface);
+ cairo_surface_destroy (surface);
+
+ return texture;
+}
+
static GList *
icon_list_from_theme (GtkWindow *window,
const gchar *name)
GtkCssValue *value;
GtkIconTheme *icon_theme;
GtkIconPaintable *info;
+ GdkTexture *texture;
gint *sizes;
gint i;
sizes[i], priv->scale,
gtk_widget_get_direction (GTK_WIDGET (window)),
0);
- if (info)
- {
- GdkTexture *texture = gtk_icon_paintable_download_texture (info);
- if (texture)
- list = g_list_insert_sorted (list, texture, (GCompareFunc) icon_size_compare);
- g_object_unref (info);
- }
+ texture = render_paintable_to_texture (GDK_PAINTABLE (info));
+ list = g_list_insert_sorted (list, texture, (GCompareFunc) icon_size_compare);
+ g_object_unref (info);
}
g_free (sizes);
#include <gtk/gtk.h>
+static GdkTexture *
+render_paintable_to_texture (GdkPaintable *paintable)
+{
+ GtkSnapshot *snapshot;
+ GskRenderNode *node;
+ int width, height;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+ GdkTexture *texture;
+ GBytes *bytes;
+
+ width = gdk_paintable_get_intrinsic_width (paintable);
+ height = gdk_paintable_get_intrinsic_height (paintable);
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+
+ snapshot = gtk_snapshot_new ();
+ gdk_paintable_snapshot (paintable, snapshot, width, height);
+ node = gtk_snapshot_free_to_node (snapshot);
+
+ cr = cairo_create (surface);
+ gsk_render_node_draw (node, cr);
+ cairo_destroy (cr);
+
+ gsk_render_node_unref (node);
+
+ bytes = g_bytes_new_with_free_func (cairo_image_surface_get_data (surface),
+ cairo_image_surface_get_height (surface)
+ * cairo_image_surface_get_stride (surface),
+ (GDestroyNotify) cairo_surface_destroy,
+ cairo_surface_reference (surface));
+ texture = gdk_memory_texture_new (cairo_image_surface_get_width (surface),
+ cairo_image_surface_get_height (surface),
+ GDK_MEMORY_DEFAULT,
+ bytes,
+ cairo_image_surface_get_stride (surface));
+ g_bytes_unref (bytes);
+ cairo_surface_destroy (surface);
+
+ return texture;
+}
+
static void
clipboard_changed_cb (GdkClipboard *clipboard,
GtkWidget *stack)
48, 1,
gtk_widget_get_direction (box),
0);
- texture = gtk_icon_paintable_download_texture (icon);
+ texture = render_paintable_to_texture (GDK_PAINTABLE (icon));
g_value_take_object (&value, gdk_pixbuf_get_from_texture (texture));
g_object_unref (texture);
g_object_unref (icon);
#include <io.h>
#endif
+static GdkTexture *
+render_paintable_to_texture (GdkPaintable *paintable)
+{
+ GtkSnapshot *snapshot;
+ GskRenderNode *node;
+ int width, height;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+ GdkTexture *texture;
+ GBytes *bytes;
+
+ width = gdk_paintable_get_intrinsic_width (paintable);
+ if (width == 0)
+ width = 32;
+
+ height = gdk_paintable_get_intrinsic_height (paintable);
+ if (height == 0)
+ height = 32;
+
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+
+ snapshot = gtk_snapshot_new ();
+ gdk_paintable_snapshot (paintable, snapshot, width, height);
+ node = gtk_snapshot_free_to_node (snapshot);
+
+ cr = cairo_create (surface);
+ gsk_render_node_draw (node, cr);
+ cairo_destroy (cr);
+
+ gsk_render_node_unref (node);
+
+ bytes = g_bytes_new_with_free_func (cairo_image_surface_get_data (surface),
+ cairo_image_surface_get_height (surface)
+ * cairo_image_surface_get_stride (surface),
+ (GDestroyNotify) cairo_surface_destroy,
+ cairo_surface_reference (surface));
+ texture = gdk_memory_texture_new (cairo_image_surface_get_width (surface),
+ cairo_image_surface_get_height (surface),
+ GDK_MEMORY_DEFAULT,
+ bytes,
+ cairo_image_surface_get_stride (surface));
+ g_bytes_unref (bytes);
+ cairo_surface_destroy (surface);
+
+ return texture;
+}
+
static GdkTexture *
get_image_texture (GtkImage *image,
int *out_size)
GtkIconTheme *icon_theme;
const char *icon_name;
int width = 48;
- GdkPaintable *paintable;
+ GdkPaintable *paintable = NULL;
GdkTexture *texture = NULL;
GtkIconPaintable *icon;
{
case GTK_IMAGE_PAINTABLE:
paintable = gtk_image_get_paintable (image);
- if (GDK_IS_TEXTURE (paintable))
- {
- *out_size = gdk_paintable_get_intrinsic_width (paintable);
- texture = g_object_ref (GDK_TEXTURE (paintable));
- }
+ break;
case GTK_IMAGE_ICON_NAME:
icon_name = gtk_image_get_icon_name (image);
icon_theme = gtk_icon_theme_get_for_display (gtk_widget_get_display (GTK_WIDGET (image)));
- *out_size = width;
icon = gtk_icon_theme_lookup_icon (icon_theme,
icon_name,
NULL,
width, 1,
gtk_widget_get_direction (GTK_WIDGET (image)),
0);
- if (icon)
- texture = gtk_icon_paintable_download_texture (icon);
- g_object_unref (icon);
+ paintable = GDK_PAINTABLE (icon);
+ break;
default:
g_warning ("Image storage type %d not handled",
gtk_image_get_storage_type (image));
}
+ if (paintable)
+ texture = render_paintable_to_texture (paintable);
+
+ g_object_unref (paintable);
+
return texture;
}
int hot_x, hot_y;
int size = 48;
+ if (widget == NULL)
+ return;
+
icon = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_for_display (gtk_widget_get_display (widget)),
icon_name,
NULL,
size, 1,
- gtk_widget_get_direction (widget),
+ gtk_widget_get_direction (widget) ,
0);
switch (hotspot)
{
g_assert (gtk_icon_paintable_get_filename (info) == NULL);
}
- if (pixbuf_size > 0)
- {
- GdkTexture *texture;
-
- texture = gtk_icon_paintable_download_texture (info);
- g_assert_cmpint (gdk_texture_get_width (texture), ==, pixbuf_size);
- g_object_unref (texture);
- }
+ g_assert_cmpint (gdk_paintable_get_intrinsic_width (GDK_PAINTABLE (info)), ==, size);
g_object_unref (info);
}
"/icons2/scalable/one-two-symbolic-rtl.svg");
}
-static void
-test_nonsquare_symbolic (void)
-{
- gint width, height;
- GtkIconTheme *icon_theme;
- GtkIconPaintable *info;
- GFile *file;
- GIcon *icon;
- GError *error = NULL;
- GdkTexture *texture;
- gchar *path = g_build_filename (g_test_get_dir (G_TEST_DIST),
- "icons",
- "scalable",
- "nonsquare-symbolic.svg",
- NULL);
-
- /* load the original image for reference */
- GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (path, &error);
- g_assert_no_error (error);
- g_assert_nonnull (pixbuf);
-
- width = gdk_pixbuf_get_width (pixbuf);
- height = gdk_pixbuf_get_height (pixbuf);
- g_assert_cmpint (width, !=, height);
-
- /* now load it through GtkIconTheme */
- icon_theme = gtk_icon_theme_get_for_display (gdk_display_get_default ());
- file = g_file_new_for_path (path);
- icon = g_file_icon_new (file);
- info = gtk_icon_theme_lookup_by_gicon (icon_theme, icon,
- height, 1, GTK_TEXT_DIR_NONE, 0);
- g_assert_nonnull (info);
-
- g_object_unref (pixbuf);
- texture = gtk_icon_paintable_download_texture (info);
-
- /* we are loaded successfully */
- g_assert_nonnull (texture);
-
- /* the original dimensions have been preserved */
- g_assert_cmpint (gdk_texture_get_width (texture), ==, width);
- g_assert_cmpint (gdk_texture_get_height (texture), ==, height);
-
- g_free (path);
- g_object_unref (texture);
- g_object_unref (file);
- g_object_unref (icon);
- g_object_unref (info);
-}
-
int
main (int argc, char *argv[])
{
g_test_add_func ("/icontheme/size", test_size);
g_test_add_func ("/icontheme/list", test_list);
g_test_add_func ("/icontheme/inherit", test_inherit);
- g_test_add_func ("/icontheme/nonsquare-symbolic", test_nonsquare_symbolic);
return g_test_run();
}